/*
 * TacticaAna.java
 *
 * Created on 17 de julio de 2006, 22:26
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.TacticaTomas;
import futbol.General;
import futbol.tacticas.concursantes.Tactica;

import java.awt.*;
import java.util.Vector;
import futbol.tacticas.*;
/**
 *
 * @author Administrador
 */
public class TacticaTomas implements Tactica{
    
	/* CONSTANTES PARA LLAMAR A LOS JUGADORES POR SU NOMBRE*/
	
	private final int PORTERO = 0;
	private final int DEFENSA_SUPERIOR = 1;
	private final int DEFENSA_CENTRAL = 2;
	private final int DEFENSA_CENTRAL_2 = 3;
	private final int DEFENSA_INFERIOR = 4;
	private final int MEDIO_SUPERIOR = 5;
	private final int MEDIO_CENTRAL = 6;
	private final int MEDIO_INFERIOR = 7;
	private final int DELANTERO_SUPERIOR = 8;
	private final int DELANTERO_CENTRAL =9;
	private final int DELANTERO_INFERIOR = 10;
	
	private int[] posValores[];
	
	private int[] VALORES_PORTERO    =  { -150,  0,   4 };
    private int[] VALORES_DEFENSA_SUPERIOR  =  { -120,  -50,  7 };
    private int[] VALORES_DEFENSA_CENTRAL   =  { -95,   10,  8 };
    private int[] VALORES_DEFENSA_CENTRAL_2   =  { -95, -10,  8 };
    private int[] VALORES_DEFENSA_INFERIOR  =  { -120,   50,  7 };

    
    private int[] VALORES_MEDIO_SUPERIOR   =  { -50,  0,  7 };
    private int[] VALORES_MEDIO_CENTRAL  =  { -10,   -60,  7 };
    private int[] VALORES_MEDIO_INFERIOR   =  { -10,  60,  7 };

    private int[] VALORES_DELANTERO_SUPERIOR  =  { 120,    70,  6 };
    private int[] VALORES_DELANTERO_CENTRAL  =  { 100,    10,  6 };
    private int[] VALORES_DELANTERO_INFERIOR   =  { 120,  -70,  6 };
	
    public TacticaTomas() {
    	posValores = new int[11][3];

    	posValores[0] = VALORES_PORTERO;
    	posValores[1] = VALORES_DEFENSA_SUPERIOR;
    	posValores[2] = VALORES_DEFENSA_CENTRAL;
    	posValores[3] = VALORES_DEFENSA_CENTRAL_2;

    	posValores[4] = VALORES_DEFENSA_INFERIOR;
    	posValores[5] = VALORES_MEDIO_SUPERIOR;
    	posValores[6] = VALORES_MEDIO_CENTRAL;
    	posValores[7] = VALORES_MEDIO_INFERIOR;

    	posValores[8] = VALORES_DELANTERO_SUPERIOR;
    	posValores[9] = VALORES_DELANTERO_CENTRAL;
    	posValores[10] = VALORES_DELANTERO_INFERIOR;
    }
    
    
    public Color getColor1() {
        return Color.LIGHT_GRAY;
    }

    public Color getColor2() {
        return Color.DARK_GRAY;
    }

    public Color getColorNumero() {
        return Color.white;
    }

    public String getNombre() {
        return "TacticaTomas";
    }

    public int getXInicial(int n) {
        return posValores[n][0];
    }

    public int getYInicial(int n) {
        return posValores[n][1];
    }

    public int getFuerza(int n) {
        return posValores[n][2];
    }

    public Vector<Comando> getComandos(SituacionJugadores sj) {
        Vector<Comando> com=new Vector();
        //Posicionamiento
        for (int n=0;n<11;n++)
            com.add(new ComandoIrA(n,posValores[n][0],posValores[n][1]));

        Point bola=sj.getBola();
        Point jugadores[]=sj.getMisJugadores();
        Point contrarios[]=sj.getContrario();
        
        //Mejorar defensa
        if (!sj.estoyMasCercaDeBola() || bola.getX()<5){
            for (int n=1;n<6;n++){
                int nJC=sj.getContrarioMasCerca(getXInicial(n), getYInicial(n));
                if(sj.getContrarioMasCerca(getXInicial(n), getYInicial(n))==8){
                	com.add(new ComandoIrA(1, contrarios[9].getX()+5, contrarios[nJC].getY()));
                	//com.add(new ComandoIrA(2, contrarios[nJC].getX()-30, contrarios[nJC].getY()-7));
                	com.add(new ComandoIrA(3, contrarios[nJC].getX()-5, contrarios[nJC].getY()-20));
                	//com.add(new ComandoIrA(4, contrarios[nJC].getX()-20, contrarios[nJC].getY()+3));
                	com.add(new ComandoIrA(5, contrarios[nJC].getX()-42, contrarios[nJC].getY()));
                	//com.add(new ComandoIrA(6, contrarios[nJC].getX()-20, contrarios[nJC].getY()-10));
                	com.add(new ComandoIrA(0, -150, 0));
                }
                else{
                	com.add(new ComandoIrA(n, contrarios[nJC].getX()+15, contrarios[nJC].getY()));
                }
            }
        }

        //Movimiento portero
        int y=(int)(bola.getY()/2);
        if (y<-20) y=-20;
        if (y>20) y=20;
        com.add(new ComandoIrA(0,posValores[0][0], y));
        
        //Movimiento mas cercano a la bola
        int nJug=sj.getMasCercanoDeBola();
        com.add(new ComandoIrA(nJug,bola.getX(), bola.getY()));

        lanzarBolaMejor(sj, com);
        
        return com;
    }
    
    private int heuristica(SituacionJugadores sj, int x, int y){
        int nHeu=y*5-x*100;
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,jugadores[n].getX(), jugadores[n].getY()));
            if (nDis<70)
                nHeu-=1000;
        }
        
        Point contrarios[]=sj.getContrario();
        for (int n=0;n<11;n++){
            int nDis=(int)(General.getDistancia(x,y,contrarios[n].getX(), contrarios[n].getY()));
            if (nDis<70)
                nHeu+=1000;
        }
        return nHeu;
    }
    
    private void lanzarBolaMejor(SituacionJugadores sj, Vector<Comando> com){
        Point bola=sj.getBola();
        int nHeuMejor=9999999;
        int xMej=0, yMej=0;
        int x=0, y=0, nHeu;
        for (int n=0;n<50;n++){
            x=(int)(Math.random()*340)-170;
            y=(int)(Math.random()*240)-120;
            nHeu=heuristica(sj,x,y);
            if (nHeuMejor>nHeu){
                nHeuMejor=nHeu;
                xMej=x;
                yMej=y;
            }
        }
        
        Point jugadores[]=sj.getMisJugadores();
        for (int n=0;n<11;n++){
            if (jugadores[n].getX()>80)
                com.add(new ComandoTiroAPuerta(n,15));
            else
                com.add(new ComandoGolpearBola(n,xMej, yMej));
                
        }
    }
    
}
